{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Relay 临时表达式"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## `TempExprNode` 和 `TempExpr`\n",
    "\n",
    "1. `TempExprNode`类：\n",
    "   - 这个类代表临时表达式的基本类型。临时表达式是在重写过程中有用的特定表达式，例如布局或类型转换。\n",
    "   - 它有虚析构函数，这意味着它可以被正确地析构，即使通过基类指针删除派生类对象。\n",
    "   - 它有纯虚函数 `Realize()`，这个函数的目的是将表达式转换为普通的（非临时的）表达式。具体实现由子类提供。\n",
    "   - 它还定义了一些静态常量，包括一个字符串类型的键值 `_type_key`，以及三个布尔类型的值 `_type_has_method_sequal_reduce`、`_type_has_method_shash_reduce` 和 `_type_child_slots`。这些值可能用于在内部跟踪或处理该类型的对象。\n",
    "   - 最后，`TVM_DECLARE_BASE_OBJECT_INFO` 宏用于声明 `TempExprNode` 的一些基本信息，如名称、父类等。\n",
    "\n",
    "2. `TempExpr`类：\n",
    "   - 使用 `TVM_DEFINE_OBJECT_REF_METHODS` 宏来定义一些方法引用。这意味着 `TempExpr` 对象可以像 `RelayExpr` 对象一样使用这些方法。这些方法允许我们在 `RelayExpr` 和 `TempExprNode` 之间进行转换。\n",
    "\n",
    "总的来说，这段代码定义了 TVM 中的两种表达式类型：`TempExprNode` 和 `TempExpr`。`TempExpr` 是 `TempExprNode` 的具体实现，可以被用来创建临时表达式。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## `TempExpr` 示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tvm\n",
    "from tvm import relay\n",
    "from tvm.relay.testing.temp_op_attr import TempOpAttr\n",
    "from tvm.relay.op import op as _op"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tvmz",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
